package chapter06._03_InnerClassTest;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.Instant;

/**
 * @Version:
 * @Description: 匿名内部类的学习
 * @LastDate: 2020/10/3
 */
public class Test03_Anonymous {

    public static void main(String[] args) {
        /*Test03_Anonymous t = new Test03_Anonymous();
        t.start(2000, true);

        JOptionPane.showMessageDialog(null, "Quit?");
        System.exit(0);*/
        Test03_Anonymous.getStaticClass();
    }

    public void start(int interval, boolean beep) {
        /*
        * 如果只是临时需要一个对象 甚至不需要创建一个具体类
        * 如下 直接写出一个类的内部
        * 称为匿名内部类
        * 具体解释：
        * 需要创建一个类 这个类实现了ActionListener接口
        * 然后在{}内定义实现方法
        * */
        var lisener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("the time is " + Instant.ofEpochMilli(e.getWhen()));
                if (beep) Toolkit.getDefaultToolkit().beep();
            }
        };
        var timer = new Timer(interval, lisener);
        timer.start();
    }

    /*
    * 匿名内部类与获取静态方法类名的结合使用
    * 1.获取类名的方法getClass()需要用到this 但是静态方法不需要对象 所以也没有this
    * 正确方法的表达式如下
    * */
    public static void getStaticClass() {
        //System.out.println("Here is " + getClass());//error
        //output Test03_Anonymous
        System.out.println("Here is " + new Object(){}.getClass().getEnclosingClass());
        //output Test03_Anonymous$2 $代表是内部类
        System.out.println("Here is " + new Object(){}.getClass());
    }
}
